#ifndef MQSAMPLEMESSAGEHANDLER_H
#define MQSAMPLEMESSAGEHANDLER_H

#include "mqmessagehandler.h"
#include "mqprotocolconfig.h"
#include <QObject>
#include <QDebug>
#include <QJsonObject>

/**
 * @brief 示例消息处理器
 * 
 * 演示如何实现 MQMessageHandler 接口
 * 提供基本的消息处理逻辑示例
 */
class MQSampleMessageHandler : public QObject, public MQMessageHandler
{
    Q_OBJECT
    
public:
    /**
     * @brief 构造函数
     * @param handlerName 处理器名称
     * @param parent 父对象
     */
    explicit MQSampleMessageHandler(const QString& handlerName = "SampleHandler", 
                                   QObject *parent = nullptr);
    
    /**
     * @brief 析构函数
     */
    ~MQSampleMessageHandler() override = default;
    
    /**
     * @brief 处理接收到的消息
     * @param exchange 交换机名称
     * @param routingKey 路由键
     * @param data 消息数据
     * @return 处理是否成功
     */
    bool handleMessage(const QString& exchange, 
                      const QString& routingKey, 
                      const QByteArray& data) override;
    
    /**
     * @brief 获取处理器名称
     * @return 处理器名称
     */
    QString getHandlerName() const override;
    
    /**
     * @brief 设置是否启用详细日志
     * @param enabled 是否启用
     */
    void setVerboseLogging(bool enabled);
    
    /**
     * @brief 获取处理的消息数量
     * @return 消息数量
     */
    int getProcessedMessageCount() const;
    
    /**
     * @brief 重置统计信息
     */
    void resetStatistics();
    
signals:
    /**
     * @brief 消息处理完成信号
     * @param exchange 交换机名称
     * @param routingKey 路由键
     * @param success 是否成功
     * @param processingTime 处理时间（毫秒）
     */
    void messageProcessed(const QString& exchange, 
                         const QString& routingKey, 
                         bool success, 
                         qint64 processingTime);
//    //消息格式正确
//    void messageFormatCorrect(QByteArray& data);

//    //消息格式错误
//    void messageFormatError(QByteArray& data);

    void ReceivedmessageReply(int code, QString info, QString request_id);
    
private:
    QString m_handlerName;           ///< 处理器名称
    bool m_verboseLogging;           ///< 是否启用详细日志
    int m_processedCount;            ///< 已处理消息数量
    int m_successCount;              ///< 成功处理数量
    int m_failureCount;              ///< 失败处理数量
    

    /**
     * @brief 构建成功响应
     * @param requestId 请求ID
     * @param data 响应数据
     * @type 1为无data，2为有data对象
     * @return JSON响应对象
     */
    QJsonObject buildSuccessResponse(const QString& requestId, const QJsonObject& data, int type = 1) const;

    /**
     * @brief 构建错误响应
     * @param requestId 请求ID
     * @param errorMsg 错误信息
     * @type 1为无data，2为有data对象
     * @return JSON响应对象
     */
    QJsonObject buildErrorResponse(const QString& requestId, const QString& errorMsg, int type = 1) const;

    /**
     * @brief 解析请求体中的JSON数据
     * @param requestBody 请求体字符串
     * @param jsonData 解析后的JSON对象输出参数
     * @param errorMsg 错误信息输出参数
     * @return 解析成功返回true，失败返回false
     */
    bool parseRequestJson(const QString& requestBody, QJsonObject& jsonData, QString& errorMsg) const;

    //"消息"    json字段验证
    bool validateRequest(const QJsonObject& requestData, QString& errorMsg);

    //"消息回复" json字段验证
    bool validateReplyRequest(const QJsonObject& requestData, QString& errorMsg);

    /**
     * @brief 模拟消息处理逻辑
     * @param data 消息数据
     * @return 处理是否成功
     */
    bool processMessageData(const QByteArray& data,  const QJsonObject& requestData);
    
    /**
     * @brief 处理普通消息
     * @param obj JSON对象
     * @return 处理是否成功
     */
    bool processCommonMessage(const QJsonObject& obj);
    
    /**
     * @brief 处理数据库修改消息
     * @param obj JSON对象
     * @return 处理是否成功
     */
    bool processDatabaseMessage(const QJsonObject& obj);
    
    /**
     * @brief 处理RXX_API类型的消息
     * @param obj 消息对象
     * @return 处理是否成功
     */
    bool processRXX_APIMessage(const QJsonObject& obj);
    
    /**
     * @brief 根据协议配置验证data_info字段
     * @param functionCode 功能码
     * @param dataInfo data_info对象
     * @param errorMsg 错误信息输出
     * @return 验证是否成功
     */
    bool validateDataInfoByConfig(const QString& functionCode, 
                                 const QJsonObject& dataInfo, 
                                 QString& errorMsg);
    
    /**
     * @brief 根据协议配置验证data_info字段（带类型检查）
     * @param functionCode 功能码
     * @param dataInfo data_info对象
     * @param errorMsg 错误信息输出
     * @return 验证是否成功
     */
    bool validateDataInfoByConfigWithType(const QString& functionCode, 
                                         const QJsonObject& dataInfo, 
                                         QString& errorMsg);
    
    /**
     * @brief 验证嵌套的data字段
     * @param functionCode 功能码
     * @param dataObject data对象
     * @param errorMsg 错误信息输出
     * @return 验证是否成功
     */
    bool validateNestedDataFields(const QString& functionCode, 
                                 const QJsonObject& dataObject, 
                                 QString& errorMsg);
    
    /**
     * @brief 验证嵌套的data字段（带类型检查）
     * @param functionCode 功能码
     * @param dataObject data对象
     * @param errorMsg 错误信息输出
     * @return 验证是否成功
     */
    bool validateNestedDataFieldsWithType(const QString& functionCode, 
                                         const QJsonObject& dataObject, 
                                         QString& errorMsg);
    
    /**
     * @brief 验证字段类型
     * @param fieldName 字段名称
     * @param fieldValue 字段值
     * @param expectedType 期望类型
     * @param errorMsg 错误信息输出
     * @return 验证是否成功
     */
    bool validateFieldType(const QString& fieldName, 
                          const QJsonValue& fieldValue, 
                          const QString& expectedType, 
                          QString& errorMsg);
    
private:
    MQProtocolConfig m_protocolConfig;   ///< 协议配置对象
};

#endif // MQSAMPLEMESSAGEHANDLER_H
